home *** CD-ROM | disk | FTP | other *** search
/ The 640 MEG Shareware Studio 2 / The 640 Meg Shareware Studio CD-ROM Volume II (Data Express)(1993).ISO / pascal / cwdkit55.zip / CWDKIT55.DOC < prev    next >
Text File  |  1989-09-30  |  32KB  |  673 lines

  1.  
  2.             Centiwrite 1.10 Developer's Kit and User's Manual
  3.              Both Items Copyright 1988 Andrew M. Saucci, Jr.
  4.  
  5.  Note that you may also inspect the copyright notice of the file CENTWR55.TPU
  6.  by entering "copy centwr55.tpu /b con" at the DOS prompt. Ignore all the
  7.  beeping and stumbling and wait for this command to finish executing.
  8.  Also, if your copy of the compressed version of the Kit is named "CWDKIT.ARC"
  9.  you should rename it "CWDKIT55.ARC".
  10.  
  11.  ****************************************************************************
  12.  
  13.                Centiwrite 1.10 Developer's Kit User's Manual
  14.                ========== ==== =========== === ====== ======
  15.  
  16.                     Copyright 1988 Andrew M. Saucci, Jr.
  17.  
  18.                             What's to Follow
  19.  
  20.  1. Introduction
  21.  2. About the Author
  22.  3. The Interface of the Unit
  23.  4. What You'll Need to Compile
  24.  5. The Basic Principles
  25.  6. A Sample Calling Program
  26.  7. Analysis of the Sample Program
  27.  8. The Initial Values
  28.  9. Initializing the Array
  29. 10. How to Overlay the Unit
  30. 11. Compatibility Consideration
  31. 12. For Extra Punch in Your Program
  32. 13. Down to Brass Tacks
  33. 14. Boilerplate
  34. 15. To All Those Who Helped
  35. 16. Coming Attractions
  36. 17. It's Alive!
  37.  
  38.  =============================================================================
  39.  
  40.                              Introduction
  41.  
  42.           Congratulations on having acquired this useful developer's tool. Now
  43. you can have an "instant editor" in your own programs whenever you need to
  44. include the capability to create short memos, notes, or letters. This file
  45. will attempt to show you how to incorporate the Centiwrite 1.10 editor into
  46. your Turbo Pascal programs. If you are unfamiliar with this editor, you should
  47. definitely obtain a copy of the stand-alone version of Centiwrite and read its
  48. User's Manual. This explains in detail the operation of the editor. Of course,
  49. as a "developer" (one of the initiated), you'll gain access to some features
  50. not used in the stand-alone version.
  51.  
  52.  =============================================================================
  53.  
  54.                             About the Author
  55.  
  56.           Andrew M. Saucci, Jr. was graduated with distinction from the
  57. New York Institute of Technology with a master's degree in computer science.
  58. He received a bachelor's degree in computer science from Hofstra University.
  59. A member of the Association of Shareware Professionals (ASP) and the
  60. Association for Computing Machinery (ACM), Mr. Saucci has programmed in
  61. Turbo Pascal for over one year. He is also the author of the program
  62. The Holy Rosary.
  63.  
  64.           Mr. Saucci can be reached at any of the following electronic mail
  65. addresses:
  66.  
  67. CompuServe  72117,241
  68. Delphi      ASAUCCI
  69. Genie       A.SAUCCI3
  70. BIX         ASAUCCI
  71.  
  72.           Comments about any of his products are most welcome; however,
  73. please allow one week for a response to your initial inquiry. After that,
  74. an "active" mailbox is checked daily. Also, for guaranteed service, use
  75. the regular mail facility of your service rather than a bulletin board area,
  76. or send a regular mail note saying to check the bulletin board. One week is
  77. a "worst case" situation. Often, mailboxes are checked more frequently.
  78.  
  79.  =============================================================================
  80.  
  81.                         The Interface of the Unit
  82.  
  83. unit centwr55;
  84. interface
  85.     uses dos, crt;
  86.     type scarray= array [1..62] of string[85];
  87.          commstruc= record
  88.                     screline: scarray;
  89.                     lastring, initWhereX, initWhereY: byte;
  90.                     CurAttr, StdAttr, MessAttr, WarnAttr: byte;
  91.                     passkey: integer;
  92.                     TimeOutInterval, NextTimeOut, oldhours: word;
  93.                     BlankChar: char;
  94.                     insmode, RetCtrlKeys, ShowStatusLine, TimeOut: boolean;
  95.                     end;
  96.     function nextword (sentence: string): integer;
  97.     function lastword (sentence: string): integer;
  98.     function isletter (charcode: char): boolean;
  99.     function isdigit (charcode: char): boolean;
  100.     function datestring: string;
  101.     function timestring: string;
  102.     function CheckSumVidBuf (x1, y1, count: byte): word;
  103.     function BufChar (xlimit, ylimit: byte): byte;
  104.     procedure AnalyzeKey (var inkey: integer; var scancode: byte);
  105.     procedure DelWord (var sentence: string; position: integer);
  106.     procedure Centiwrite (var infoexch: commstruc);
  107.  
  108. implementation
  109. { Implementation would follow here. }
  110.  
  111.  
  112. Each of the variables used in the "commstruc" (for "communications structure"
  113. record is described below.
  114.  
  115. screline: The strings which represent each line of the text to a maximum of
  116.           62. This accomodates 25-, 43-, and 50-line screens.
  117.  
  118. lastring: The number of currently "valid" strings in screline. Because a line
  119.           consisting solely of a carriage return (ASCII 13-10) is represented
  120.           by a null string, "lastring" indicates how many lines of screline
  121.           are currently being used. Note that in an empty file, lastring is 1.
  122.  
  123. initWhereX: The initial x-coordinate of the cursor on entry to the editor.
  124.  
  125. initWhereY: The initial y-coordinate of the cursor on entry to the editor.
  126.  
  127. CurAttr: The color attribute of the cursor. You can use any valid attribute.
  128.          If the foreground and background are the same, the Centiwrite editor
  129.          assumes that the blinking hardware cursor is being used, and the
  130.          software cursor is disabled. The cursor will appear as a blinking
  131.          CHARACTER if a background color greater than 7 is used.
  132.  
  133. StdAttr: The normal color attribute of the editor.
  134.  
  135. MessAttr: The color attribute for messages which appear on the status line.
  136.  
  137. WarnAttr: The color attribute for the word "Overstrike" when visible.
  138.  
  139. TimeOutInterval: The number of minutes between timeouts. If this is set
  140.                  to zero, timeouts are disabled.
  141.  
  142. NextTimeOut: Time in minutes of the next timeout. If the next timeout is
  143.              at 4:43, this variable could have the values 43, 103, 163, ...
  144.              through 65535 (the maximum for a word), or (43+ 60*n), where
  145.              n is the number of hours to the next timeout. On the hour,
  146.              NextTimeOut is decremented by 60 (if it exceeds 59).
  147.  
  148. oldhours: Hours at the last time check. This is passed as part of the
  149.           structure because the calling program must initialize it before
  150.           the first call to Centiwrite. You should re-initialize it if
  151.           you leave Centiwrite for more than an hour. Basically, this is
  152.           used as a "rollover" flag.
  153.  
  154. passkey: The character passed back to the main program when Centiwrite does
  155.          not define a function for it. (This is now an INTEGER.)
  156.  
  157. BlankChar: The character that is displayed at the cursor position when
  158.            the character at that position is either ASCII zero, ASCII 32
  159.            (blank), or ASCII 255. All of these normally appear as a blank,
  160.            and you may need to choose an alternate character, particularly
  161.            for those using monochrome monitors. You may select any character
  162.            except ASCII 7, 8, 10, or 13.
  163.  
  164. insmode: If true, then the editor is in Insert mode. Otherwise, Overstrike
  165.          mode is used.
  166.  
  167. RetCtrlKeys: Set this to true if you want control keys (ASCII 1 to 31,
  168.              except 8, 9, and 13) returned to the calling program.
  169.              Otherwise, set it to false so that Ctrl-L, for example,
  170.              will insert an ASCII 12 (form-feed). Even if control keys
  171.              are returned, using the Alt+ numeric keypad method of
  172.              entering characters will always insert the appropriate
  173.              character, except for ASCII 7, 8, 10, and 13, which are
  174.              ignored. Backspace, Tab, and Enter are never returned this way.
  175.  
  176. ShowStatusLine: Set this flag to true if you require the status line,
  177.                 which shows the current state of Insert/Overstrike and
  178.                 the current position on the screen. If this is set to
  179.                 false, no status line is displayed and the top line
  180.                 is available for editing. When ShowStatusLine is false,
  181.                 the Insert key is returned to the calling procedure for
  182.                 action, so that any display or indication of the Insert/
  183.                 Overstrike mode that the caller maintains (in lieu of
  184.                 the status line) may be updated by the caller. Also, the
  185.                 F5, F8, and Ctrl-F8 keys are ignored (because they use
  186.                 the status line for their display).
  187.  
  188. TimeOut: When set to true, TimeOut indicates that the calling procedure
  189.          has received control on account of a timeout, and that the
  190.          appropriate timeout procedures or functions should be
  191.          executed. Otherwise, the caller received control because of
  192.          an unrecognized or Ctrl-key.
  193.  
  194. The functions and procedures which are included are summarized next.
  195.  
  196. nextword: Returns the position of the next word in a string. In the string
  197.           "for he's a jolly good fellow", nextword returns 4. If no "next
  198.           word" is found, the return value is the length of the string plus 1.
  199.  
  200. lastword: Returns the position of the last word in a string. In the string
  201.           "which nobody can deny", lastword returns 18. If the string is a
  202.           single word, the return value is 1.
  203.  
  204. datestring: Returns the current system date in the form "Monday, May 26, 1988".
  205.  
  206. timestring: Returns the current system time in the form "10:45:44 PM".
  207.  
  208. CheckSumVidBuf: Returns a checksum of the characters in the video buffer
  209.                 starting at a given location (in REAL coordinates-- not
  210.                 those recognized by the CRT unit) and continuing for
  211.                 count characters. This procedure is not used by the
  212.                 editor, but is included because it is important to
  213.                 all programmers who want to discourage tampering with
  214.                 their programs. (Real coordinates start at 0,0 and are
  215.                 not relative to the current window.)
  216.  
  217. BufChar: Returns the character at the cursor location and advances the
  218.          cursor one column to the right, or to the beginning of the
  219.          next line. "xlimit" is the x-coordinate (again, in real coordinates)
  220.          at which the cursor should wrap to the next line. "ylimit" is the
  221.          y-coordinate of the bottom of the screen. If the cursor is in the
  222.          lower right corner of the screen, the character is returned but
  223.          the cursor is not advanced. This function is also not used by
  224.          the editor, but it is the function that the stand-alone version
  225.          of Centiwrite uses to load a screen into the editor. Now you
  226.          can use it, too!
  227.  
  228. AnalyzeKey: Substitute keyboard reading procedure (for ReadKey). A single
  229.             call returns all pertinent keyboard information-- no need to
  230.             make multiple calls to check for extended key codes.
  231.             Extended key codes are returned in inkey as values in excess
  232.             of 255-- for example, F6 is returned as 322. Note that "inkey"
  233.             is an INTEGER variable. To get the value returned in "inkey",
  234.             add 256 to the extended key code (F6 is 322, or 64+ 256).
  235.             This procedure is now written in assembly language for
  236.             extra speed.
  237.  
  238. DelWord: Deletes the word starting at a given location in a string.
  239.  
  240. Centiwrite: The editor itself.
  241.  
  242.  =============================================================================
  243.  
  244.                        What You'll Need to Compile
  245.  
  246.           In order to compile a program using Centiwrite, you need to copy
  247. CENTWR55.TPU into the directory where Turbo Pascal normally looks for your
  248. .TPU files. In version 5.5, this is one of the EXE & TPU directories specified
  249. under the Options/Directories menu selection. You will also need to add the
  250. line "uses centwr55;" to the the source file of the procedure that calls the
  251. editor. Check your Turbo Pascal manual for additional information on including
  252. units in your programs. Oh, yes, you'll also need Turbo Pascal version 5.5.
  253. For those concerned about needing to recompile for future versions of the
  254. compiler, the current plan is to update the unit whenever a new version of
  255. Turbo Pascal is released. Upgrades will be available for a modest charge.
  256.  
  257.           With the advent of Turbo Pascal 5.5, units may incorporate object-
  258. oriented programming techniques. This means that a unit such as this one could
  259. be distributed as a .TPU file, yet a user could make changes to it without
  260. the need for the source code. If possible, the Developer's Kit will be
  261. revised to take advantage of this opportunity.
  262.  
  263.  =============================================================================
  264.  
  265.                            The Basic Principles
  266.  
  267.           The Centiwrite editor is based upon an "array of strings"
  268. implementation. While not suitable for a large text editor or word processor,
  269. this approach is quite adequate for a simple program such as this. It allows
  270. a "quick and dirty" style, and is easily understandable. Each element in the
  271. array of strings represents a line of text on the screen. An "implied"
  272. carriage return ends each line. A count of the current number of lines is
  273. maintained at all times. A duplicate array is maintained in memory in order
  274. to facilitate the "Undo" feature (invoked by F3).
  275.  
  276.           Some may wonder why the video memory is not used to store the
  277. text, considering that the text is stored there anyway. Use of character
  278. strings allows the use of Turbo Pascal's string-handling procedures. Using
  279. video memory would mean writing substantially more code in order to duplicate
  280. the functions already available in the runtime library. This code would not
  281. only make the program larger, but would also need to be debugged. The Turbo
  282. Pascal string-handling routines (while not perfect) are already thoroughly
  283. debugged.
  284.  
  285.  =============================================================================
  286.  
  287.                         A Sample Calling Procedure
  288.  
  289.           The following program is an example of how to call the editor.
  290.  
  291. program CallEditor (input, output);
  292. uses dos, crt, centwr55;
  293. var reg: registers;
  294. origcx: word;
  295. cwinfo: commstruc;
  296. i: byte;
  297. hours, minutes, seconds, hundredths: word;
  298.  
  299. procedure SaveFile;
  300. begin
  301. writeln ('Code for saving a file would be here.');
  302. delay (2500);
  303. end;
  304.  
  305. procedure HelpProcedure;
  306. begin
  307. writeln ('Help! Help!');
  308. delay (2500);
  309. end;
  310.  
  311. begin
  312. reg.ah:= $03;
  313. reg.bh:= $00;
  314. intr ($10, reg);  { Save old cursor }
  315. origcx:= reg.cx;
  316. reg.ah:= $01;
  317. reg.cx:= $2000;
  318. intr ($10, reg);  { Disable hardware cursor }
  319. with cwinfo do    { Allows unqualified variable references. }
  320. begin
  321. insmode:= true;     { Initialize structure variables. }
  322. initWhereX:= 1;
  323. initWhereY:= 1;
  324. CurAttr:= $70;  { Black on LightGray }
  325. StdAttr:= $17;  { LightGray on Blue }
  326. MessAttr:= $20; { Black on Green }
  327. WarnAttr:= $4F; { White on Red }
  328. for i:= 1 to 25 do
  329.     screline[i]:= '';  { empty file }
  330. lastring:= 1;
  331. passkey:= 0;
  332. RetCtrlKeys:= false;
  333. ShowStatusLine:= true;
  334. BlankChar:= #32; { pick the blank character because of the CurAttr we used }
  335. TimeOutInterval:= 5;  { causes a timeout every five minutes }
  336. GetTime (hours, minutes, seconds, hundredths);
  337. NextTimeOut:= minutes+ TimeOutInterval;   { set first timeout }
  338. oldhours:= hours;     { initialize rollover flag }
  339. repeat
  340.    window (1, 1, 80, 25);
  341.    TextAttr:= $07;
  342.    ClrScr;
  343.    writeln ('Joe''s Program: Centiwrite Editor-- Alt-X to Exit');
  344.    window (1, 2, 80, 25);
  345.    Centiwrite (cwinfo);      { <------------- PLUG-IN EDITOR }
  346.    window (1, 1, 80, 25);
  347.    TextAttr:= $07;
  348.    if TimeOut     { Short-circuit the other tests-- passkey contains }
  349.       then begin  { values which have already been processed. }
  350.            passkey:= 0;
  351.            end;
  352.    if ((passkey= 346) or (passkey= 316)) or (TimeOut)
  353.       { If Alt-X, F2, or TimeOut, save the file. }
  354.       then SaveFile;
  355.    if passkey= 315  { F1 displays a list of keys and their functions. }
  356.       then HelpProcedure;
  357. until ((passkey= 288) or (passkey= 346));  { Alt-D or Alt-X (exit condition) }
  358. end;  { with statement }
  359. ClrScr;
  360. reg.ah:= $01;
  361. reg.cx:= origcx;
  362. intr ($10, reg); { restore cursor }
  363. end.  { program }
  364.  
  365.  =============================================================================
  366.  
  367.                        Analysis of the Sample Program
  368.  
  369.           Take a close look at the sample program. Although it has been
  370. simplified in order to highlight the main points, its basic structure is
  371. the same as that of the stand-alone version of Centiwrite 1.10. You should
  372. be able to compile and run it. It gives initial values to the members of the
  373. structure, and then runs the editor in a repeat..until loop.
  374.  
  375.           Why a loop? This is the means you can use to add your own "frills"
  376. to the editor. Any time the Centiwrite editor sees a key that it does not
  377. recognize, such as F9, Alt-Z, or PageDown, the editor terminates and control
  378. returns to the calling procedure. Placing the editor in a loop gives you a
  379. chance to execute whatever procedures or functions you like before RETURNING
  380. control, or exiting if you like. For example, Alt-X is the "recommended" exit
  381. key. The editor takes no special action on seeing Alt-X; it merely exits just
  382. the same as it would for any other unrecognized key. The "until" condition
  383. "passkey=288" is what causes the sample program to terminate. To use F10 as
  384. an exit key, just change the condition to "passkey=324". Likewise, what
  385. displays help is "passkey=315"; to use Shift-F1, change to "passkey=340".
  386.  
  387.          Note that the editor recognizes all keys that return an ASCII value
  388. plus the following extended keys:
  389.  
  390. arrow keys        Shift-Tab          Ctrl-Left arrow       Alt- B E H T V Y
  391. Insert            Home/End           Ctrl-Right arrow      F3  F5  F7  F8
  392. Delete            Ctrl-Home/End      Ctrl-F8
  393.  
  394.          The calling procedure is passed any other keys and may deal with them
  395. however it sees fit. The variable "passkey" will hold the value of the last
  396. key pressed. By using the flag RetCtrlKeys, you can specify additional keys
  397. to be returned.
  398.  
  399.           Notice the "window" statement just before the call to Centiwrite.
  400. This is absolutely necessary in order for the editor to establish its window
  401. boundaries and insure the integrity of its screen. The editor can operate
  402. in a window no narrower than 40 columns. It has not been tested in windows
  403. of fewer than 24 rows; however, it should work for any number of rows.
  404. (For a single row "window" you should use "liminput", the complete source
  405. code to which is found in the Deciwrite Developer's Kit.) If you specify a
  406. window size of fewer than 40 columns, greater than the screen width, or
  407. greater than the screen height, the result is unknown.
  408.  
  409.           The Centiwrite editor redraws its window each time it is called, and
  410. it leaves the screen in place when it exits. Therefore, you can put a window
  411. over it without any trouble.
  412.  
  413.  ============================================================================
  414.  
  415.                           The Initial Values
  416.  
  417.           The most important value in "commstruc" is "lastring". If you use
  418. an invalid value for lastring, the editor will become confused and behave
  419. erratically. Lastring should be 1 for an empty file. Otherwise, it reflects
  420. the number of currently valid strings in the array "screline".
  421.  
  422. Example.
  423.  
  424. If screline is this (line numbers added):
  425.  
  426. [1] Now is the time for all good people.
  427. [2] We must mobilize now.
  428. [3]
  429. [4] May we have your support?
  430.  
  431. then lastring is 4. If two carriage returns are added after line 4, as in
  432.  
  433. [4] May we have your support?
  434. [5]
  435. [6]
  436.  
  437. then lastring is 6. Lastring should only be changed when the number of lines
  438. in the text is changed.
  439.  
  440.           Here's an important note about carriage returns. The Centiwrite
  441. editor does NOT add the ASCII 13-10 combination explicitly to the text. Every
  442. string ends in an IMPLIED 13-10. If you write a file to disk, you must add the
  443. 13-10 yourself. This is easily done using a "writeln(screline[i])"-type
  444. statement. You need not delete a 13-10 on input, however, as the editor
  445. automatically removes these (as well as ASCII 7 and 8) from the text. You
  446. should, however, take care to format the input strings so that they do not
  447. contain embedded carriage returns that really belong at the end of a line.
  448.  
  449.           InitWhereX and initWhereY are used to position the cursor when
  450. the editor is called. For the first invocation, each of these should usually be
  451. set to 1, although any valid values are acceptable. Never position the cursor
  452. below the row "lastring", or erratic operation will result. When the editor
  453. passes control back to the calling procedure, the current cursor position is
  454. saved in initWhereX and initWhereY. It can then be reused if necessary when
  455. the editor is called again. Pressing F9 demonstrates this simply. The cursor
  456. position is saved; the editor returns control to the main program; the main
  457. program ignores the key (because no function has been defined for it there,
  458. either); and the editor regains control, positioning the cursor at the saved
  459. location.
  460.  
  461.           Insmode, as explained earlier, is simply a flag. It's your choice--
  462. set it however you like depending upon whether you want to start the editor in
  463. Insert mode or Overstrike mode.
  464.  
  465.           Passkey must be initialized. If a timeout occurs before the first
  466. key is pressed, the internal check of passkey will fail if passkey
  467. contains garbage.
  468.  
  469.           You must also initialize BlankChar, RetCtrlKeys, and ShowStatusLine.
  470. They are explained previously.
  471.  
  472.           You do not have to initialize TimeOut, because it is set to
  473. false each time the editor is called.
  474.  
  475.  ============================================================================
  476.  
  477.                            Initializing the Array
  478.  
  479.           You must initialize "screline" before using it. This can be done
  480. any way you like-- with assignment statements, reads, Move, etc. You should
  481. assign an initial value to "maxline" elements in screline, where "maxline" is
  482. equal to the maximum number of lines on the screen plus 1. Be sure to keep
  483. "lastring" synchronized with the actual number of elements of screline in use.
  484.  
  485.  =============================================================================
  486.  
  487.                           How to Overlay the Unit
  488.  
  489.          This unit is compiled using {$O+}. This means that you may
  490. overlay it using the methods outlined in Chapter 13 of the Turbo Pascal
  491. Reference Guide, just as you would do for any other unit compiled with {$O+}.
  492. If you do not want to overlay the unit, simply ignore this feature. While it
  493. has not been tested as an overlay, it should work just as well either way.
  494.  
  495.  =============================================================================
  496.  
  497.                          Compatibility Consideration
  498.  
  499.           The Centiwrite editor uses direct screen writes (through Turbo
  500. Pascal's CRT unit). This may cause problems, particularly with windowing
  501. environments such as Desqview or Concurrent DOS. If you need to write to
  502. the screen using the video BIOS functions, place the line "uses crt" in
  503. your main program and set the built-in CRT variable DirectVideo to "false".
  504. Otherwise, DirectVideo will be assumed to be "true".
  505.  
  506.  =============================================================================
  507.  
  508.                        For Extra Punch in Your Program
  509.  
  510.           If you want to use a "plug-in editor" in your program, but feel
  511. Centiwrite just isn't powerful enough, don't walk away feeling dejected.
  512. Here's good news! Also available is an editor similar to Centiwrite but ten
  513. times as powerful. It's Deciwrite! The Deciwrite Developer's Kit includes all
  514. the features of Centiwrite PLUS:
  515.  
  516. 1. Automatic word wrap and paragraph reformatting.
  517. 2. Full support for binary files.
  518. 3. Time and date can be inserted into the text with one keystroke.
  519. 4. Full source code-- including liminput, a replacement for readln; dectohex
  520.    and hextodec, hexadecimal conversion routines; and FileCheck, which checks
  521.    for the existence of a file and determines if it is read-only; and more!
  522.  
  523.           What's more, if you're not sure, you can "lock in" the price of
  524. the Deciwrite Developer's Kit by buying the Centiwrite Developer's Kit NOW.
  525. You'll have one year to upgrade at the current price (plus $1 for shipping),
  526. PLUS you get a credit for what you paid for the Centiwrite Developer's Kit.
  527. What's to lose? Send electronic mail to the addresses listed earlier to learn
  528. how to take advantage of this great offer. Don't forget, too, that the
  529. Deciwrite Developer's Kit comes with a 30-day money-back guarantee no matter
  530. when you buy it.
  531.  
  532.  =============================================================================
  533.  
  534.                            Down to Brass Tacks
  535.  
  536.       As of July 1, 1989, this is the Centiwrite/Deciwrite price list.
  537.  
  538.                                     Individual License        Site License
  539. *#    Centiwrite 1.10                    $20.00                  $250.00
  540.  #    Deciwrite  1.10                    $30.00                  $500.00
  541.       Deciwrite  1.10 Demo Disk          $ 4.00                  *******
  542. *#    Centiwrite 1.10 Developer's Kit    $32.50                  $550.00
  543.         Upgrade to later TP version      $ 5.00                  $ 60.00
  544.  #    Deciwrite 1.10 Developer's Kit     $75.00                  $950.00
  545.       Disk replacement fee               $ 3.00                    none
  546.  
  547.     * These items may be ordered through the Public (Software) Library;
  548.       others must be ordered directly from the author.
  549.  
  550.     # Please add $4.00 shipping & handling to these items.
  551.  
  552.       New York State residents and businesses MUST add their local sales tax
  553.       or provide proof of exemption. Send electronic mail if you are uncertain
  554.       of your local tax rate. Specify your address and county. The shipping
  555.       and handling charge is NOT included in the calculation of sales tax.
  556.  
  557.       Residents of other states will in most cases be required to remit the
  558.       appropriate tax directly to their state tax department.
  559.  
  560.       The Deciwrite Demo Disk includes one $3.00 discount off the purchase
  561.       of Deciwrite 1.10.
  562.  
  563.       An individual license permits the user to operate the program on
  564.       a single computer at a time, while a site license permits unlimited use
  565.       within the confines of a contiguous area of the owner's property.
  566.  
  567.       These prices are guaranteed not to increase through October 1, 1989.
  568.  
  569.       Custom implementations of these programs are also available on
  570.       request for modest additional fees. Send electronic mail to one
  571.       of the addresses listed earlier.
  572.  
  573.       If you would like to use your Visa or MasterCard to register this
  574.       program, you may order through the Public (Software) Library.
  575.       The number to call for orders is 1-800-2424-PSL (1-800-242-4775).
  576.       Information and questions about orders is available from the PSL
  577.       at 713-665-7017. You may also write to the PSL at P.O. Box 35707,
  578.       Houston, TX 77235-5705, or send electronic mail via CompuServe to
  579.       71355,470. When writing, you should sign your letter, include your
  580.       card number and its expiration date, and specify that you want to
  581.       register Centiwrite, (CWDKIT55.ARC), by Andrew M. Saucci, Jr. Please
  582.       note that the PSL is not equipped to answer questions about Centiwrite
  583.       itself. Such questions are best directed to one of the electronic
  584.       mail addresses listed earlier. Also note that no surcharge
  585.       is imposed on credit card orders.
  586.  
  587.       Make checks payable to
  588.  
  589.       Andrew M. Saucci, Jr.
  590.       641 Koelbel Ct
  591.       Baldwin, NY 11510-3915.
  592.  
  593.       Please specify the disk size you require.
  594.  
  595.       You may wish to check one of the electronic mail addresses to verify
  596.       that the above address is current. Please use this "physical" address
  597.       ONLY for orders, unless you lack a modem. All other correspondence,
  598.       including technical support questions, should be directed to one of
  599.       the electronic mail addresses whenever possible.
  600.  
  601.  ============================================================================
  602.  
  603.               Before Going to the Highest Court in the Land
  604.  
  605.    This program is produced by a member of the Association of Shareware
  606. Professionals (ASP).  ASP wants to make sure that the shareware principle
  607. works for you. If you are unable to resolve a shareware-related problem with
  608. an ASP member by contacting the member directly, ASP may be able to help. The
  609. ASP Ombudsman can help you resolve a dispute or problem with an ASP member,
  610. but does not provide technical support for members' products. Please write to
  611. the ASP Ombudsman at P.O. Box 5786, Bellevue, WA 98006 or send a CompuServe
  612. message via EasyPlex to ASP Ombudsman 70007,3536.
  613.  
  614.  ============================================================================
  615.  
  616.                              Special Bonus
  617.  
  618.           All registered users of the Centiwrite Developer's Kit are also
  619. licensed to use the stand-alone version of Centiwrite (CWRITE.EXE) at no
  620. additional charge. CWRITE.EXE is included on the distribution disk that will
  621. be sent to you when your order is received. Also, registered users receive
  622. the source code for DIRALL.EXE, one of the programs provided to registered
  623. users of the stand-alone version of Centiwrite. DIRALL.EXE provides a
  624. regular directory listing, but highlights hidden files in boldface.
  625.  
  626.           A registered user is also entitled to unlimited telephone, U. S.
  627. mail, or electronic mail support. If such a user finds a bug within three
  628. months of purchase, it will either be fixed or the purchase price will be
  629. refunded.
  630.  
  631.  ============================================================================
  632.  
  633.                                Boilerplate
  634.  
  635.           Liability in the event of defects in Centiwrite 1.10 and/or the
  636. Centiwrite 1.10 Developer's Kit is expressly limited to replacement of the disk
  637. on which Centiwrite and/or the Developer's Kit was originally provided. No
  638. other liability of any sort is either implied or assumed. In particular, the
  639. user is responsible for all consequential damages, such as loss of income,
  640. loss of data, pain and suffering, etc.
  641.  
  642.  ============================================================================
  643.  
  644.                         To All Those Who Helped
  645.  
  646.           Thanks to all those who gave their assistance toward the completion
  647. of this program, especially Michael Day, Neil Rubenking, Scott Bussinger, and
  648. all the other helpful people who frequent Borland's Programming Forum A
  649. (BPROGA) on CompuServe. It's truly amazing!
  650.  
  651.  ============================================================================
  652.  
  653.                            Coming Attractions
  654.  
  655.           A plan to produce a full-size text editor based on Centiwrite and
  656. Deciwrite is in the works. Please use Centiwrite to write a short note
  657. describing a few of the features you would like to see in a text editor,
  658. particularly anything that is not found in other programs, and send it to one
  659. of the electronic mail addresses. The result could be a really good program.
  660. You might also indicate what incentives are most likely to cause you to
  661. purchase registered copies of programs distributed on a "try-before-you-buy"
  662. basis. Your suggestions will be most appreciated.
  663.  
  664.  ============================================================================
  665.  
  666.                                It's Alive!
  667.  
  668.           This program is not carved in stone. Many of you no doubt have
  669. extensive experience in this field, and your comments and suggestions are
  670. valuable and welcome. Send them to the electronic mail addresses listed.
  671.  
  672.  ============================= END OF FILE ===================================
  673.